package org.nanquan.dotjava.tags;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;

import org.apache.struts.taglib.tiles.util.TagUtils;

public class MethodTag  extends TagSupport {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 2463970847093634347L;

	@Override
	public int doAfterBody() throws JspException {
		// TODO 自动生成方法存根
		//System.out.println("MethodTag.doAfterBody");
		super.doAfterBody();
		return 0;
	}

	@Override
	public int doEndTag() throws JspException {
		// TODO 自动生成方法存根
		
		//System.out.println("MethodTag.doEndTag");
		RunMethod runmethod=new RunMethod();
		try
		{
			name=this.property!=null? TagUtils.getProperty(TagUtils.findAttribute((String)name, this.pagecontext), (String) this.property): TagUtils.findAttribute((String)name, this.pagecontext);
			Class [] types =new Class[this.paramtypes.size()];
			for (int i=0;i<this.paramtypes.size(); i++) {
				types[i]=this.paramtypes.get(i)!=null?this.paramtypes.get(i):this.parameters.get(i).getClass();
			}
			runmethod.execute(name,methodname, parameters.toArray(),types);
			
		}catch(Exception ex)
		{
			ex.printStackTrace();
		}
		this.parameters.clear();
		this.paramtypes.clear();
		super.doEndTag();
		return 6;
	}

	@Override
	public int doStartTag() throws JspException {
		// TODO 自动生成方法存根
		 super.doStartTag();
		 return 2;
	}

	@Override
	public String getId() {
		// TODO 自动生成方法存根
		return super.getId();
	}

	@Override
	public Tag getParent() {
		// TODO 自动生成方法存根
		return super.getParent();
	}

	@Override
	public Object getValue(String arg0) {
		// TODO 自动生成方法存根
		return super.getValue(arg0);
	}

	@Override
	public Enumeration getValues() {
		// TODO 自动生成方法存根
		return super.getValues();
	}

	@Override
	public void setId(String arg0) {
		// TODO 自动生成方法存根
		super.setId(arg0);
	}

	@Override
	public void setPageContext(PageContext arg0) {
		// TODO 自动生成方法存根
		super.setPageContext(arg0);
		this.pagecontext=super.pageContext;
	}

	@Override
	public void setParent(Tag arg0) {
		// TODO 自动生成方法存根
		super.setParent(arg0);
	}

	@Override
	public void setValue(String arg0, Object arg1) {
		// TODO 自动生成方法存根
		super.setValue(arg0, arg1);
	}

	private Object name;
	
	private Object property;
	
	private String methodname;
	
	private List<Object> parameters=new ArrayList<Object>();
	
	private List<Class> paramtypes=new ArrayList<Class>();
	
	private MethodParameter [] parametertags;
	
	private PageContext pagecontext;

	public String getMethodname() {
		return methodname;
	}

	public void setMethodname(String methodname) {
		this.methodname = methodname;
	}

	public Object getName() {
		return name;
	}

	public void setName(Object name) {
		this.name = name;
	}

	public PageContext getPagecontext() {
		return pagecontext;
	}

	public void setPagecontext(PageContext pagecontext) {
		this.pagecontext = pagecontext;
	}

	public List<Object> getParameters() {
		return parameters;
	}

	public void setParameters(List<Object> parameters) {
		this.parameters = parameters;
	}

	public MethodParameter[] getParametertags() {
		return parametertags;
	}

	public void setParametertags(MethodParameter[] parametertags) {
		this.parametertags = parametertags;
	}

	public Object getProperty() {
		return property;
	}

	public void setProperty(Object property) {
		this.property = property;
	}
	
	public void addParameter(Object obj)
	{
		this.parameters.add(obj);
	}
	
	public void addParameTypes(Class obj)
	{
		this.paramtypes.add(obj);
	}

	public List<Class> getParamtypes() {
		return paramtypes;
	}

	public void setParamtypes(List<Class> paramtypes) {
		this.paramtypes = paramtypes;
	}


}
